home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 42 / Amiga Format AFCD42 (Issue 126, Aug 1999).iso / -serious- / comms / other / micq-0.4.0 / nonblkout.c < prev    next >
C/C++ Source or Header  |  1999-05-14  |  3KB  |  143 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <stdarg.h>
  5. #include <dos/dos.h>
  6. #include <proto/dos.h>
  7. #include <proto/exec.h>
  8.  
  9.  
  10. #define bufsize 16384
  11. #define linesize 1024
  12. char outbufque[bufsize];
  13. char *outbufwptr=outbufque,*outbufrptr=outbufque,*outbufnrptr=outbufque;
  14. struct FileHandle *outfilehandle=NULL;
  15. struct StandardPacket *dospacket=NULL;
  16. struct MsgPort *dosport=NULL;
  17. struct FileHandle *outputfilehandle=NULL;
  18.  
  19.  
  20. void addchartobuf(char c);
  21. void addstrtobuf(char *s, int l);
  22. void cleanoutbuf(void);
  23. int initoutbuf(void);
  24. void writeoutbufout(void);
  25. void outbufprintf(char *template, ...);
  26.  
  27.  
  28.  
  29.  
  30.  
  31. void cleanoutbuf()
  32.  {
  33.   if (dospacket && dospacket->sp_Msg.mn_Node.ln_Succ!=NULL)
  34.    {
  35.     AbortPkt(dosport,&dospacket->sp_Pkt);
  36.     while (GetMsg(dosport)==NULL)
  37.      WaitPort(dosport);
  38.     while (GetMsg(dosport));
  39.    }
  40.   if (dospacket) FreeDosObject(DOS_STDPKT,(char *)dospacket+sizeof(dospacket->sp_Msg));
  41.   if (dosport) DeleteMsgPort(dosport);
  42.  }
  43.  
  44.  
  45. int initoutbuf()
  46.  {
  47.   BPTR so;
  48.   if (outputfilehandle) return -1;
  49.   if ((so=Output())==NULL) return -2;
  50.   outputfilehandle=(struct FileHandle *)(((int)so)<<2);
  51.   if ((dospacket=(struct StandardPacket *)AllocDosObject(DOS_STDPKT,NULL))==NULL) return -3;
  52.   dospacket=(char *)dospacket-sizeof(dospacket->sp_Msg);
  53.   dospacket->sp_Msg.mn_Node.ln_Succ=NULL;
  54.   dospacket->sp_Msg.mn_Node.ln_Name=(char *)&dospacket->sp_Pkt;
  55.   dospacket->sp_Pkt.dp_Link=&dospacket->sp_Msg;
  56.   atexit(cleanoutbuf);
  57.   if ((dosport=CreateMsgPort())==NULL) return -4;
  58.   return 0;
  59.  }
  60.  
  61.  
  62. void addchartobuf(char c)
  63.  {
  64.   if (outbufrptr-1==outbufwptr || (outbufrptr==outbufque && outbufwptr==outbufque+bufsize-1))  return;
  65.   *outbufwptr++=c;
  66.   if (outbufwptr>=outbufque+bufsize) outbufwptr=outbufque;
  67.  }
  68.  
  69.  
  70. void addstrtobuf(char *s, int sl)
  71.  {
  72.   int l,r;
  73.   if (sl==0) return;
  74.   r=outbufrptr-outbufwptr-1;
  75.   if (r==0) return;
  76.   else if (r<0) r=bufsize-r-2;
  77.   if (r>sl) l=sl; else l=r;
  78.   if ((outbufwptr-outbufque+l)<bufsize)
  79.    {
  80.     memcpy(outbufwptr,s,l);
  81.     outbufwptr+=l;
  82.    }
  83.   else
  84.    {
  85.     r=outbufque+bufsize-outbufwptr;
  86.     if (r)
  87.      {
  88.       memcpy(outbufwptr,s,r);
  89.       l=l-r;
  90.      }
  91.     outbufwptr=outbufque;
  92.     if (l)
  93.      {
  94.       outbufwptr=outbufque;
  95.       memcpy(outbufwptr,s+r,l);
  96.       outbufwptr+=l;
  97.      }
  98.    }
  99.  }    
  100.  
  101.  
  102. void writeoutbufout()
  103.  {
  104.   if (dospacket->sp_Msg.mn_Node.ln_Succ==NULL || GetMsg(dosport)==&(dospacket->sp_Msg))
  105.    {
  106.     if (dospacket->sp_Msg.mn_Node.ln_Succ!=NULL)
  107.      {
  108.       dospacket->sp_Msg.mn_Node.ln_Succ=NULL;
  109.       outbufrptr=outbufnrptr;
  110.      }
  111.     if (outbufrptr==outbufwptr) return;
  112.     if (outbufwptr<outbufrptr)
  113.      {
  114.       outbufnrptr=outbufque;
  115.       dospacket->sp_Pkt.dp_Arg3=outbufque+bufsize-outbufrptr;
  116.      }
  117.     else
  118.      {
  119.       outbufnrptr=outbufwptr;
  120.       dospacket->sp_Pkt.dp_Arg3=outbufwptr-outbufrptr;
  121.      }
  122.     dospacket->sp_Pkt.dp_Action=ACTION_WRITE;
  123.     dospacket->sp_Pkt.dp_Arg1=outputfilehandle->fh_Arg1;
  124.     dospacket->sp_Pkt.dp_Arg2=(int)outbufrptr;
  125.     SendPkt(&(dospacket->sp_Pkt),outputfilehandle->fh_Type,dosport);
  126.    }
  127.   return;
  128.  }
  129.   
  130. void outbufprintf(char *template, ...)
  131.  {
  132.    char linebuf[linesize];
  133.    va_list args;
  134.    if (dospacket==NULL) return;
  135.    va_start(args,template);
  136.    vsprintf( linebuf, template, args );
  137.    addstrtobuf(linebuf,strlen(linebuf));
  138.    writeoutbufout();
  139.    va_end(args);
  140.  }
  141.  
  142.  
  143.